package com.moli.iov.task.service.impl;
//
//import com.moli.iov.exception.BusinessException;
//import com.moli.iov.protocol.model.dto.realtime.RealTimeInfoDto;
//import com.moli.iov.real.service.IRealService;
//import com.moli.iov.rest.RestResponse;
//import com.moli.iov.task.model.dto.VehicleOdoDto;
//import com.moli.iov.task.remoting.op.reponse.VehiclePushResponseHandler;
import com.moli.iov.task.service.VehicleOdoTaskService;
//import com.moli.iov.util.CommonUtils;
//import com.moli.iov.util.JsonUtils;
import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.StringUtils;
//
//import javax.annotation.Resource;
//import java.io.IOException;
//import java.util.ArrayList;
//import java.util.List;
//import java.util.concurrent.CountDownLatch;
//import java.util.concurrent.TimeUnit;

/**
 * @ClassName VehicleOdoServiceTaskImpl
 * @Description 推送里程数据服务
 * @Author 李伟松
 * @CreateDate 2019-03-20 下午 3:15
 * @UpdateDate 2019-03-20 下午 3:15
 * @Version 1.0
 */
@Slf4j
@Service("vehicleOdoServiceTask")
public class VehicleOdoServiceTaskImpl implements VehicleOdoTaskService {

//    @Resource
//    IRealService realService;
//
//    @Resource
//    VehiclePushResponseHandler vehiclePushResponseHandler;
//
//    @Autowired
//    private ThreadPoolTaskExecutor taskExecutor;
//
//    @Value("${op_retry_time}")
//    private long opRetryTime;
//
//    @Value("${op_odo_send_count}")
//    private int sendCount;
//
//    @Value("${op_odo_push_url}")
//    private String url;

    /**
     * @Param: []
     * @Return: void
     * @Description 推送里程业务主函数
     * @Author 李伟松
     * @CreateDate 2019-03-20 下午 4:47
     */
    @Override
    public void exec() throws Exception {

//        //获取全量车辆状态数据
//        RestResponse<List<RealTimeInfoDto>> resp = realService.listAllRealTimeInfo();
//        if (resp != null
//                && resp.isFlag()
//                && !CollectionUtils.isEmpty(resp.getData())) {
//
//            List<RealTimeInfoDto> realTimeInfolist = resp.getData();
//            List<VehicleOdoDto> result = new ArrayList<>();
//
//            //将实时状态对象转化成里程对象
//            for (RealTimeInfoDto realTimeInfoDto : realTimeInfolist) {
//                if (realTimeInfoDto != null
//                        && !StringUtils.isEmpty(realTimeInfoDto.getVin())
//                        && realTimeInfoDto.getVehicleAll() != null) {
//                    VehicleOdoDto dto = new VehicleOdoDto();
//                    dto.setOdo(realTimeInfoDto.getVehicleAll().getOdometer());
//                    dto.setVin(realTimeInfoDto.getVin());
//                    result.add(dto);
//                }
//            }
//
//            //分批发送里程数据
//            if (!result.isEmpty()) {
//                sendCount = sendCount <= 0 ? 500 : sendCount;
//                int i = result.size() / sendCount;
//                if((result.size() % sendCount )>1){
//                    i++;
//                }
//                log.info("推送里程{}",result.size());
//                List<List<VehicleOdoDto>> res = CommonUtils.averageAssign(result, i);
//                CountDownLatch countDownLatch = new CountDownLatch(i);
//                log.info("推送里程,分配次数为{}",res.size());
//                for (List<VehicleOdoDto> tmp : res) {
//                    //异步推送车辆里程数据
//                    log.info("推送里程，单次推送车辆数",res.size());
//                    asyncPushVehicleOdoList(tmp, countDownLatch);
//                }
//                countDownLatch.await(30,TimeUnit.SECONDS);
//                log.info("推送里程数据完成");
//            }else{
//                log.error("获取里程结果为 null");
//            }
//        } else {
//            log.error("查询全量车辆状态，未获取到数据");
//            throw new BusinessException("查询全量车辆状态，未获取到数据");
//        }

    }


//    /**
//     * @Param: [list, countDownLatch]
//     * @Return: void
//     * @Description 异步推送里程列表、具备错误重发机制
//     * @Author 李伟松
//     * @CreateDate 2019-03-20 下午 4:46
//     */
//    private void asyncPushVehicleOdoList(List<VehicleOdoDto> list, CountDownLatch countDownLatch) {
//
//        taskExecutor.execute(() -> {
//            String json = JsonUtils.toJson(list);
//            try {
//                log.info("推送里程,单次异步车辆数",list.size());
//                vehiclePushResponseHandler.push(url,json);
//            } catch (IOException e) {
////                e.printStackTrace();
//                log.error("里程推送失败", e);
//                //失败重发
//                try {
//                    TimeUnit.SECONDS.sleep(opRetryTime);
//                    vehiclePushResponseHandler.push(url,json);
//                } catch (InterruptedException e1) {
//                    log.error("里程推送重发休眠失败,{}", e.getMessage());
//                    //                    e.printStackTrace();
//                } catch (IOException e1) {
//                    log.error("里程推送重发失败,{}", e.getMessage());
////                    e1.printStackTrace();
//                }
//            }finally {
//                countDownLatch.countDown();
//            }
//        });
//
//    }


}
